﻿using System.Collections.Generic;
using System;

namespace SharedTypes
{
    /// <summary>
    /// Базовый класс для алгоритмов исполнительного файла данных.
    /// </summary>
    public abstract class Algorithm : IAlgorithm
    {
        #region Members
        /// <summary>
        /// Exe иследуемой сборки.
        /// </summary>
        private string exeName;

        /// <summary>
        /// Имя алгоритма.
        /// </summary>
        private string algName;

        /// <summary>
        /// Путь к библиотеке, содержащей алгоритм.
        /// </summary>
        private string path;

        /// <summary>
        /// xml описания библиотеки
        /// </summary>
        private string fullPathXml;

        private TimeSpan timeElapsed;
        /// <summary>
        /// Список адаптируемых параметров.
        /// </summary>
        private IDictionary<int, LinkedParameter> parameters;
        #endregion // Members

        #region Properties
        /// <summary>
        /// Exe иследуемой сборки.
        /// </summary>
        public string ExeName
        {
            get { return exeName; }
        }

        /// <summary>
        /// Имя алгоритма.
        /// </summary>
        public string AlgorithmName
        {
            get { return algName; }
        }

        /// <summary>
        /// Путь к библиотеке, содержащей алгоритм.
        /// </summary>
        public string Path
        {
            get { return path; }
        }

        /// <summary>
        /// xml описания библиотеки
        /// </summary>
        public string FullPathXml
        {
            get { return fullPathXml; }
        }
        
        public TimeSpan TimeElapsed 
        {
            get { return timeElapsed; }
            set { this.timeElapsed = value; }
        }

        /// <summary>
        /// Список адаптируемых параметров.
        /// </summary>
        public IDictionary<int, LinkedParameter> Parameters
        {
            get { return parameters; }
        }

        /// <summary>
        /// Количество адаптируемых параметров.
        /// </summary>
        public int NumberOfParameters
        {
            get { return parameters.Count; }
        }
        #endregion // Properties

        #region Constructor
        /// <summary>
        /// Конструктор.
        /// </summary>
        /// <param name="name">Exe иследуемой сборки</param>
        /// <param name="path">Путь к библиотеке, содержащей алгоритм.</param>
        /// <param name="parameters">Список адаптируемых параметров.</param>
        public Algorithm(string exe, string name, string path, string xmlPath,
                         IDictionary<int, LinkedParameter> parameters)
        {
            this.exeName = exe;
            this.algName = name;
            this.path = path;
            this.parameters = parameters;
            this.fullPathXml = xmlPath;
        }
        #endregion // Constructor

        #region Methods
        /// <summary>
        /// Запускает процесс исполнительного файла.
        /// </summary>
        /// <param name="parameters">Список применяемых параметров.</param>
        /// <returns>Размер полученого архива.</returns>
        public abstract long DoCompression(IDictionary<int, LinkedParameter> parameters);


        /// <summary>
        /// Устанавливает директория, исполнительного файла которой будет выполняться.
        /// </summary>
        /// <param name="path">Абсолютный путь к директории.</param>
        public abstract void SetCompressionTarget(string path);

        /// <summary>
        /// Запускает процесс исполнительного файла с параметрами, рекомендуемыми поставщиком
        /// алгоритма исполнительного файла.
        /// </summary>
        /// <param name="parameters">Список применяемых параметров.</param>
        /// <returns>Размер полученного архива.</returns>
        public abstract long GetResultWithRecomendedParameters(IDictionary<int, LinkedParameter> parameters);
        #endregion // Methods
    }
}
